#include <iostream>
#include <vector>

using namespace std;

vector<int> *Func() { return new vector<int>; }

void func2() {
  auto v = Func();
  int i;
  while (cin >> i) {
    v->push_back(i);
  }
  for (auto value : *v) {
    cout << value << endl;
  }
  delete v;
  v = nullptr;
}

int main(int argc, char const *argv[]) {
  /* code */
  func2();
  return 0;
}
// 知识点1：new和delete相对于智能指针来说非常容易出错，最好使用智能指针来管理动态内存

// 知识点2：在自由空间分配的内存是无名的，因此new无法为其分配对象命名，而是返回指向该对象的指针

// 知识点3：默认情况下，new分配的对象是默认初始化的，这就说明内置类型或者组合类型将是为定义的(l例如：int，会指向一个为初始化的int)，类类型对象将用默认构造函数进行初始化(例如string，会产生一个空string)。

// 知识点4：建议使用值初始化(在最后加一对小括号即可)，值初始化的内置类型对象有着良好定义的值

// 知识点5：auto只有单一参数时可以使用，可以使用new分配const对象

// 知识点6：delete完成两个操作：销毁给定指针所指向的对象，释放对应的内存，delete的参数必须是指向动态分配的对象或是一个空指针。

// 知识点7：内置类型指针管理的动态内存在被显式的释放前一直都会存在，因为内置类型与类类型不同，虽然内置类型的指针会在离开作用域后被销毁，但是其内存依然存在

// 知识点8：同一块内存释放两次：两个内置类型的指针指向同一块自由空间分配的内存，在对一个指针进行delete之后，其指向的内存也会被释放，若再对第二个指针进行delete，会造成自由空间破坏

// 知识点9：忘记使用delete，使用已经释放掉的对象都是经常发生的(使用new和delete时)，所以尽可能的使用智能指针

// 知识点10：在很多机器上，即使delete了某个内置类型的指针(也就是说释放了对应的内存空间)，虽然指针已经无效，但是其仍然保留这释放空间的对应地址，变成了空悬指针，也就是说我们要保留指针，可以将其置为空指针
